package com.ruoyi.common.utils.file;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

public class InitFileUtils {

    private static final List<FilePo> fileList = createFileList();

    private static List<FilePo> createFileList() {
        List<FilePo> filePos = new ArrayList<>();

        // 项目建设前期
        FilePo projectInit = createDirectory("一、项目建设前期",
                "1、项目建议书",
                "2、可行性研究报告及批复文件",
                "3、初步设计、概算及批复文件",
                "4、资金到位、下达文件"
        );

        // 综合管理
        FilePo comprehensiveManagement = createDirectory("二、综合管理",
                "1、合同工程开工报告、开工申请及审批文件、开工令(停工令、复工令)",
                "2、项目部成立、印章启用、现场组织机构及主要人员进场报审、人员资质文件",
                "3、工程项目划分报审文件",
                "4、施工设备、仪器进场报验及设备仪器校验、率定文件",
                "5、原材料及构配件进场文件(报验单、出厂合格证、质量保证书、进场试验检验报告及台账等）",
                "6、工作联系单、备忘录、往来文函、会议纪要、咨询报告",
                "7、施工月(季、年)报、安全月报、施工日志、大事记",
                "8、质量问题整改、事故、质量缺陷调查、认定、处理、验收记录及质量缺陷台账等",
                "9、施工设计变更、变更价格文件",
                "10、施工音像文件(进场时的初始地形、地貌、各阶段节点、重要隐蔽、关键部位、缺陷处理、重要会议及完工新貌、五牌一图等施工文明标语及设施)",
                "11、其他相关文件（质量监督备案手续）"
        );

        // 施工技术
        FilePo constructionTechnology = createDirectory("三、施工技术",
                "1、施工组织设计、施工计划、施工方案、施工措施、施工工艺报审文件",
                "2、作业指导书",
                "3、工程技术要求、技术(安全)交底、图纸会审纪要",
                "4、监理变更指示单及设计通知单",
                "5、质量和安全保证体系文件(制度、机构)",
                "6、其他相关文件（安全标准化建设资料）"
        );

        // 施工检测试验
        FilePo testingExperiment = createDirectory("四、施工检测试验",
                "1、工地实验室成立、资质、授权文件（外委试验协议、资质文件）",
                "2、混凝土、砂浆配合比文件",
                "3、质量检测试验综合成果文件",
                "4、其他相关文件"
        );

        // 竣工图、竣工图编制说明、竣工图监理审核意见
        FilePo completionDrawing = createDirectory("五、竣工图、竣工图编制说明、竣工图监理审核意见");

        // 水工建筑物
        FilePo hydraulicStructures = createDirectory("六、水工建筑物",
                "1、交桩记录、施工定位(水准点、导线点、基准线、控制点等)测量、复核记录",
                "2、施工测量成果、报审",
                "3、施工放样、报审",
                "4、基础处理、基础工程施工、桩基工程、地基验槽记录",
                "5、灌浆原始记录",
                "6、混凝土浇筑开仓报审文件",
                "7、单元工程(含隐蔽工程、关键部位)质量验收、评定报审文件(工序、三检、试验、测量、施工记录等)及验收评定台账",
                "8、分部工程质量评定表、分部工程验收申请、批复、工作报告、验收鉴定书、授权书",
                "9、分部工程验收遗留问题处理方案、备案表、验收文件",
                "10、其他相关文件"
        );

        // 管理设施、生活区与施工营地等建筑工程
        FilePo managementFacilities = createDirectory("七、管理设施、生活区与施工营地等建筑工程",
                "1、基线复核、桩基复核文件",
                "2、桩基工程施工记录、验收记录",
                "3、钢筋混凝土施工记录及质量评定资料",
                "4、基槽开挖验槽记录",
                "5、砌体工程质量评定材料",
                "6、建筑物垂直度观测、沉降观测记录",
                "7、外墙装饰工程施工原材料质量保证材料、安装工艺试验报告及质量评定材料、检验报告",
                "8、给排水工程施工记录、排水管道检验记录及施工质量检查记录",
                "9、装修工程材料合格证、消防记录、空调调试及检查记录",
                "10、分项工程质量报验及验收记录(含隐蔽工程、关键部位)、检验批验收记录(测量、施工记录等)及验收评定台账",
                "11、分部工程报验及验收记录",
                "12、其他相关文件"
        );

        // 交通工程(道路、桥梁)
        FilePo trafficEngineering = createDirectory("八、交通工程(道路、桥梁)",
                "1、路基土壤标准击实试验记录、路基、基层压实度试验记录",
                "2、地基验槽、软基处理、隐蔽工程验收、水泥混凝土施工、道路中线竣工测量等资料",
                "3、工程基线复核、桩基复核记录、桩基工程施工记录、验收记录",
                "4、水下混凝土及连续墙混凝土灌注记录",
                "5、路面摩擦系数检测报告",
                "6、结构沉降观测、路面、桥面中心线标高竣工测量施工记录",
                "7、钢筋混凝土预应力张拉记录、试验报告验收记录等",
                "8、桥面工程材料试验报告及合格证",
                "9、桥面基层交验记录、铺筑记录",
                "10、道路照明工程设备材料报告、调试、安装就位、试运转等施工记录",
                "11、栏杆工程、人行道工程施工文件",
                "12、分项工程质量报验及验收记录(含隐蔽工程、关键部位)、检验批验收记录(测量、施工记录等)及验收评定台账",
                "13、分部工程报验及验收记录",
                "14、分部工程验收遗留问题处理方案、备案表、验收文件",
                "15、其他相关文件"
        );

        // 施工辅助工程(含临时工程)
        FilePo auxiliaryEngineering = createDirectory("九、施工辅助工程(含临时工程)",
                createDirectory("1、场地平整",
                        "（1）交桩记录、施工定位(水准点、导线点、基准线、控制点等)测量、复核记录",
                        "（2）施工测量成果、报审",
                        "（3）施工放样、报审",
                        "（4）基础处理、基础工程施工、桩基工程、地基验槽记录",
                        "（5）灌浆原始记录",
                        "（6）混凝土浇筑开仓报文件",
                        "（7）单元工程(含隐蔽工程、关键部位）质量验收、评定报审文件(工序、三检、试验、测量、施工记录等)及验收评定台账",
                        "（8）分部工程质量评定表、分部工程验收申请、批复、工作报告、验收鉴定书、授权书",
                        "（9）分部工程验收遗留问题处理方案、备案表、验收文件",
                        "（10）其他相关文件"
                ),
                createDirectory("2、围堰工程",
                        "（1）交桩记录、施工定位(水准点、导线点、基准线、控制点等)测量、复核记录",
                        "（2）施工测量成果、报审",
                        "（3）施工放样、报审",
                        "（4）基础处理、基础工程施工、桩基工程、地基验槽记录",
                        "（5）灌浆原始记录",
                        "（6）混凝土浇筑开仓报审文件",
                        "（7）单元工程(含隐蔽工程、关键部位）质量验收、评定报审文件(工序、三检、试验、测量、施工记录等)及验收评定台账",
                        "（8）分部工程质量评定表、分部工程验收申请、批复、工作报告、验收鉴定书、授权书",
                        "（9）分部工程验收遗留问题处理方案、备案表、验收文件",
                        "（10）其他相关文件"
                ),
                createDirectory("3、砂石系统",
                        "（1）生产设施、设备进场报验材料",
                        "（2）生产、措施及报审材料",
                        "（3）原材料供应协议",
                        "（4）产品检验报告",
                        "（5）其他相关文件"
                )
        );

        // 安全监测工程
        FilePo safetyMonitoring = createDirectory("十、安全监测工程",
                "1、监测仪器厂家提供材料(含监测系统设计报告、工程运用及管理方案、合格证等)",
                "2、监测仪器(内观仪器、外观仪器、二次仪表、测绘仪器)率定材料",
                "3、监测仪器(内观仪器、外观仪器、二次仪表、测绘仪器)检验材料",
                "4、仪器埋设、外部设施安装考证、工序质量评定材料",
                "5、监测原始数据及现场巡视检查材料",
                "6、内观仪器及外观设施观测材料、测读仪器材料、监测设施维护记录",
                "7、测试、沉降、位移、变形等监测记录",
                "8、安全监测工作周(月、季、年、简)报、专题报告及相关说明材料",
                "9、单元工程(含隐蔽工程、关键部位)质量验收、评定报审文件(工序、三检、试验、测量、施工记录等)及验收评定台账",
                "10、分部工程验收申请、批复、分部工程质量评定表、工作报告、验收鉴定书、授权书",
                "11、分部工程验收遗留问题处理方案、备案表、验收文件",
                "12、其他相关文件"
        );

        // 水土保持(含绿化、水系恢复)工程
        FilePo soilWaterConservation = createDirectory("十一、水土保持(含绿化、水系恢复)工程",
                "1、水土保持监测站(网)建设方案(含布置图)及审批文件",
                "2、水士保特监测成果、分析报告",
                "3、花卉、树林、青草等进场报验及质量证明文件",
                "4、花卉、树林等布置图",
                "5、绿地、树种、苗圃、园林等统计资料",
                "6、单元工程质量验收、评定报审文件及验收评定台账",
                "7、分部工程质量评定、验收文件及遗留问题处理方案、备案表",
                "8、其他相关文件"
        );

        // 环境保护工程
        FilePo environmentalProtection = createDirectory("十二、环境保护工程",
                "1、环境保护监测站(网)建设方案(含布置图)及审批文件",
                "2、环境监测成果、分析报告",
                "3、环境监测(观测)记录",
                "4、其他相关文件"
        );

        // 消防工程
        FilePo fireProtection = createDirectory("十三、消防工程",
                "1、消防设施维护保养检验记录、操作维护人员登记表",
                "2、设备、材料安装手册、质量证明、保修卡、交货清单、操作使用说明书等随机文件",
                "3、隐蔽工程检查验收记录",
                "4、水、气压试验记录，阀门(单体)水压试验记录等",
                "5、单元工程质量验收、评定报审文件及验收评定台账",
                "6、分部工程质量评定、验收文件及遗留问题处理方案备案表",
                "7、其他相关文件"
        );

        // 验收
        FilePo acceptance = createDirectory("十四、验收",
                "1、单位工程验收申请、批复、外观及单位工程质量评定表、各方工作报告、验收鉴定书、验收人员授权书",
                "2、单位工程验收遗留问题处理方案、备案表、验收文件",
                "3、合同工程完工验收申请、批复、各方工作报告、验收鉴定书、合同工程完工证书、授权书",
                "4、合同工程完工验收进留问题处理方案、备案表、验收文件",
                "5、施工合同完工的档案检查或验收等文件",
                "6、合同工程交接签证",
                "7、阶段验收",
                "8、专项验收",
                "9、竣工验收",
                "10、其他相关文件"
        );

        // 结算、支付
        FilePo settlementPayment = createDirectory("十五、结算、支付",
                "1、施工进度款、结算文件及发票",
                "2、合同变价、索赔文件",
                "3、其他费用相关文件",
                "4、审计报告"
        );

        // 其他
        FilePo others = createDirectory("十六、其他");

        // 将所有顶级目录添加到文件列表中
        filePos.add(projectInit);
        filePos.add(comprehensiveManagement);
        filePos.add(constructionTechnology);
        filePos.add(testingExperiment);
        filePos.add(completionDrawing);
        filePos.add(hydraulicStructures);
        filePos.add(managementFacilities);
        filePos.add(trafficEngineering);
        filePos.add(auxiliaryEngineering);
        filePos.add(safetyMonitoring);
        filePos.add(soilWaterConservation);
        filePos.add(environmentalProtection);
        filePos.add(fireProtection);
        filePos.add(acceptance);
        filePos.add(settlementPayment);
        filePos.add(others);

        return filePos;
    }

    private static FilePo createDirectory(String name, Object... children) {
        FilePo directory = new FilePo();
        directory.setFileName(name);
        List<FilePo> childList = new ArrayList<>();
        for (Object child : children) {
            if (child instanceof String) {
                FilePo childFile = new FilePo();
                childFile.setFileName((String) child);
                childList.add(childFile);
            } else if (child instanceof FilePo) {
                childList.add((FilePo) child);
            }
        }
        directory.setChild(childList);
        return directory;
    }

    @Data
    public static class FilePo {
        private String fileName;
        private List<FilePo> child;
    }

    public static void main(String[] args) {
        // 输出文件结构
        printFileStructure(fileList, 0);
    }
    public static List<FilePo> getFileList(){
        return fileList;
    }
    private static void printFileStructure(List<FilePo> files, int indent) {
        for (FilePo file : files) {
            for (int i = 0; i < indent; i++) {
                System.out.print("  ");
            }
            System.out.println(file.getFileName());
            if (file.getChild() != null) {
                printFileStructure(file.getChild(), indent + 1);
            }
        }
    }
}